package ticker 
{
	import flash.display.Stage;
	import flash.events.Event;
	import flash.utils.getTimer;
	/**
	 * 程序中所有Ticker的管理器
	 * @author gcxk721
	 */
	public class TickerPlug
	{
		/**
		 * 单例模式
		 */
		private static const _instance : TickerPlug = new TickerPlug();
		
		/**
		 * 总Tikcer管理器当前的运行状态
		 * true   正在运行
		 */
		private var _state : Boolean = false;
		
		/**
		 * 舞台
		 */
		private var _stage : Stage = null;
		
		/**
		 * 上一帧的毫秒数
		 */
		private var _lastTime : int = 0;
		
		/**
		 * Ticker管理器列表
		 */
		private var _managerLst : Vector.<ITickerManager> = new Vector.<ITickerManager>();
		
		/**
		 * 所有TickerManager的数量
		 */
		private var _managerLength : int = 0;
		
		public function TickerPlug() 
		{
			if (_instance != null)
			{
				throw new Error("Ticker is single instance!");
			}
		}
		
		/**
		 * 开始TickerManager
		 * 外部代码必须先调用此方法，整个Ticker才能运行
		 * @param	stage
		 */
		public function start(stage : Stage) : void
		{
			_stage = stage;
			if (_stage != null)
			{
				_stage.addEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
				_state = true;
			}
		}
		
		/**
		 * 添加一个Ticker管理器
		 * @param	manager
		 */
		public function addManager(manager : ITickerManager) : void
		{
			if (checkManager(manager) == -1)
			{
				_managerLst.push(manager);
				_managerLength = _managerLst.length;
				if (!_state)//如果没有运行  开始运行
				{
					start(_stage);
				}
			}
		}
		
		/**
		 * 关闭一个Ticker管理器
		 * @param	manager
		 */
		public function delManager(manager : ITickerManager) : void
		{
			var index : int = checkManager(manager);
			if (index != -1)//TickerManager 存在
			{
				_managerLst.splice(index, 1);
				_managerLength = _managerLst.length;
				if (_managerLength == 0)
				{
					stop();
				}
			}
		}
		
		/**
		 * 添加一个Ticker到管理器中
		 * @param	tickName
		 * @param	tick
		 */
		public function addTicker(tickName : String, tick : Ticker) : void
		{
			var manager : ITickerManager = findTickerManager(tickName);
			if (manager != null)
			{
				manager.addTicker(tick);
			}
			else
			{
				throw new Error(tickName + " TickerManager is not add to TickerPlug!");
			}
		}
		
		/**
		 * 删除一个Ticker
		 * @param	tickName
		 * @param	tick
		 */
		public function delTicker(tickName : String, tick : Ticker) : void
		{
			var manager : ITickerManager = findTickerManager(tickName);
			if (manager != null)
			{
				manager.delTicker(tick);
			}
			else
			{
				throw new Error(tickName + " TickerManager is not add to TickerPlug!");
			}
		}
		
		/**
		 * 查找TickerManager
		 * @param	tickName
		 * @return
		 */
		private function findTickerManager(tickName : String) : ITickerManager
		{
			for (var i : int = 0; i < _managerLength; ++i)
			{
				if (_managerLst[i].getName() == tickName)
				{
					return _managerLst[i];
				}
			}
			return null;
		}
		
		/**
		 * 检查manager是否正在管理器运行
		 * @param	manager
		 * @return
		 */
		private function checkManager(manager : ITickerManager) : int
		{
			return _managerLst.indexOf(manager);
		}
		
		/**
		 * 帧频时间处理
		 * @param	e
		 */
		private function onEnterFrameHandler(e:Event):void 
		{
			var time : int = getTimer();
			//每一帧的时间
			var delay : int = time - _lastTime;
			_lastTime = time;
			doTicker(delay);
		}
		
		/**
		 * 执行Ticker
		 * 实际上每一帧都会调用
		 * @param	time
		 */
		private function doTicker(time : int) : void
		{
			for (var i : int = 0; i < _managerLength; ++i)
			{
				_managerLst[i].onTicker(time);
			}
		}
		
		/**
		 * 停止TickerManager
		 * 调用此方法以后，将会停止所有Ticker
		 */
		public function stop() : void
		{
			if (_stage != null)
			{
				_stage.removeEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
				_state = false;
			}
		}
		
		public static function get instance() : TickerPlug
		{
			return _instance;
		}
		
	}

}